package controlmercancias.remoto;

import controlmercancias.dominio.Tren;
import controlmercancias.dominio.Usuario;
import controlmercancias.util.SocketManager;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

/**
 *
 * @author Hasier
 */
public class ServidorTrenDemon {

    private static Map<String, Tren> trenes;
    private static int maxConnections = 5;
    private static int numConexionesActivas = 0;

    public static void main(String[] args) {
        init();
        try {
            ServerSocket ss = new ServerSocket(8089);
            for (;;) {
                Socket socket = ss.accept();
                if (numConexionesActivas < maxConnections) {
                    ServidorTren s = new ServidorTren(socket);
                    new Thread(s).start();
                    numConexionesActivas++;
                } else {
                    SocketManager sm = new SocketManager(socket);
                    sm.write("410 Petición rechazada");
                    sm.close();
                }
            }
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }

    private static void init() {
        trenes = new HashMap<String, Tren>();
        //FIXME Inicializar trenes, sensores... cargando de la BD
    }

    /**
     * Devuelve los trenes que puede configurar el usuario
     * @param u Usuario del que obtener los trenes
     * @return Un mapa con los trenes que puede manejar el usuario, cuya key es el id del tren
     */
    public static Map<String, Tren> loadTrenesParaUsuario(Usuario u) {
        //FIXME Cargar los trenes de la base de datos y ponerselos al atributo del usuario u
        Map<String, Tren> mapa = new HashMap<String, Tren>();
        Collection<Tren> values = trenes.values();
        ArrayList<String> listaTrenes = u.getListaTrenes();
        for (Tren t : values) {
            for (String s : listaTrenes) {
                if (t.getId().equals(s)) {
                    mapa.put(s, t);
                    break;
                }
            }
        }
        return mapa;
    }

    public static void setMaxConnections(int max) {
        maxConnections = max;
    }
    
    static void trainServerFinished() {
        numConexionesActivas--;
    }
}
